package com.itheima.controller;

import com.itheima.domain.User;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.awt.*;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
//请求参数
@Controller
public class UserController {

    //普通参数：请求参数与形参名称对应即可完成参数传递
    @RequestMapping("/commonParam")
    @ResponseBody
    /**
     * 使用@RequestParam指定参数时，如果不做其它设置，默认参数必须传入，否则报错：400的错误
     * Required String parameter userName; is not present
     *  @RequestParam属性：
     *      value = "userName"：表示指定请求url参数或者form表单参数名称
     *      required = false：默认值是true，表示必须传入，如果不传入，则报错；
     *      defaultValue = "laowang"：一般配合required = false一块使用，如果不传入，则使用默认值
     *    注意事项：一旦使用了 @RequestParam注解指定请求的具体参数名称，则方法的形参名称失效
     */
    public String commonParam(@RequestParam(value = "userName",required = false,defaultValue = "laowang") String name
            ,int age){
        System.out.println("普通参数传递 name ==> "+name);
        System.out.println("普通参数传递 age ==> "+age);
        return "{'module':'common param'}";
    }

    //POJO参数：请求参数与形参对象中的属性对应即可完成参数传递
    @RequestMapping("/pojoParam")
    @ResponseBody
    public String pojoParam(User user){
        System.out.println("pojo参数传递 user ==> "+user);
        return "{'module':'pojo param'}";
    }

    //嵌套POJO参数：嵌套属性按照层次结构设定名称即可完成参数传递
    @RequestMapping("/pojoContainPojoParam")
    @ResponseBody
    public String pojoContainPojoParam(User user){
        System.out.println("pojo嵌套pojo参数传递 user ==> "+user);
        return "{'module':'pojo contain pojo param'}";
    }

    //数组参数：同名请求参数可以直接映射到对应名称的形参数组对象中
    @RequestMapping("/arrayParam")
    @ResponseBody
    public String arrayParam(String[] likes){
        System.out.println("数组参数传递 likes ==> "+ Arrays.toString(likes));
        return "{'module':'array param'}";
    }

    //集合参数：同名请求参数可以使用@RequestParam注解映射到对应名称的集合对象中作为数据
    /*
        @RequestParam:作用是将请求的参数自动封装到一个对象中
            通知指定参数名称来封装数据，如果不指定，则默认使用形参名称
            @RequestParam("hobby")
            总之，指定了新的入参名称，则必须有，否则报异常
     */
    @RequestMapping("/listParam")
    @ResponseBody
    public String listParam(@RequestParam("hobby") List<String> likes){
        System.out.println("集合参数传递 likes ==> "+ likes);
        return "{'module':'list param'}";
    }


    //集合参数：json格式
    //1.开启json数据格式的自动转换，在配置类中开启@EnableWebMvc
    //2.使用@RequestBody注解将外部传递的json数组数据映射到形参的集合对象中作为数据
    @RequestMapping("/listParamForJson")
    @ResponseBody
    public String listParamForJson(@RequestBody List<String> likes){
        System.out.println("list common(json)参数传递 list ==> "+likes);
        return "{'module':'list common for json param'}";
    }

    //POJO参数：json格式
    //1.开启json数据格式的自动转换，在配置类中开启@EnableWebMvc
    //2.使用@RequestBody注解将外部传递的json数据映射到形参的实体类对象中，要求属性名称一一对应
    @RequestMapping("/pojoParamForJson")
    @ResponseBody
    public String pojoParamForJson(@RequestBody User user){
        System.out.println("pojo(json)参数传递 user ==> "+user);
        return "{'module':'pojo for json param'}";
    }

    //集合参数：json格式
    //1.开启json数据格式的自动转换，在配置类中开启@EnableWebMvc
    //2.使用@RequestBody注解将外部传递的json数组数据映射到形参的保存实体类对象的集合对象中，要求属性名称一一对应
    @RequestMapping("/listPojoParamForJson")
    @ResponseBody
    public String listPojoParamForJson(@RequestBody List<User> list){
        System.out.println("list pojo(json)参数传递 list ==> "+list);
        return "{'module':'list pojo for json param'}";
    }

    /**
     * produces = "application/json;charset=UTF-8"
     *  表示告知浏览器产生的数据类型使用json格式，编码是utf-8
     * @return
     */
//    @RequestMapping(value = "/getData",produces = "application/json;charset=UTF-8")
    @RequestMapping(value = "/getData")
    @ResponseBody
    public String getData(){
        return "你好spring";
    }


    // Failed to convert from type [java.lang.String] to type [java.util.Date] for value '2022-04-25'

    /**
     * Date默认字符串格式：yyy/mm/dd,其他格式报错；
     *  @DateTimeFormat可指定需要转化的日期字符串格式
     * @param date1
     * @param date2
     * @param date3
     * @return
     */
    @RequestMapping("/getDate")
    @ResponseBody
    public String getDate(Date date1,
                          @DateTimeFormat(pattern = "yyyy-MM-dd") Date date2,
                          @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date date3){
        System.out.println(date1);
        return "getDate";
    }



}











